// filename: parent.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>

#define SHM_SIZE 1024
#define SEM_NAME "/my_semaphore"

int main() {
    key_t key = ftok("shared_memory_example", 65); // 使用ftok获取唯一键值，文件名可自定义
    int shmid;
    void *shmaddr;
    // 创建共享内存
    if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666)) == -1) {
        perror("shmget");
        exit(1);
    }
    // 将共享内存附加到父进程的地址空间
    if ((shmaddr = shmat(shmid, (void *)0, 0)) == (void *)-1) {
        perror("shmat");
        exit(1);
    }
    // 初始化共享内存区域，例如设置初始值
    memset(shmaddr, 0, SHM_SIZE);
    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    } else if (pid == 0) { // 子进程
        printf("Child process started.\n");
        execlp("./child", "child", (char *)NULL);
    } else { // 父进程
        printf("Parent process waiting...\n");
        // 等待子进程初始化完成
        // 父进程读取或修改共享内存中的数据
        sleep(3);
        char *data = shmaddr;
        printf("Data from shared memory: %s\n", data);
        wait(NULL); // 等待子进程结束
        // 释放共享内存（通常在程序结束时）
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);
    }
    return 0;
}